/**
 * 子任务错误处理测试
 * */
#include "SwTask.h"
#include "stdio.h"
#include "SwTask_err.h"

sw_task_t sw_root = 0;
sw_task_t sw_child1 = 0;

//最底层如果不需要使用异步，可以直接处理之后返回状态，不需要嵌入SW_BEGIN和SW_END
char sw_child2_task(){
    printf("error in child2\n");
    return SW_ERROR;
}

char sw_child1_task(){
    //由于封装的switch，变量的声明最好放在开头，即switch之前
    //在switch里面理论上也可以，所有case属于同一代码块，能够互相访问变量
    char result = SW_WAITING;

    SW_BEGIN(sw_child1);
    
        SW_WAIT_TASK_WITH_RESULT(sw_child1, sw_child2_task(), result);
        SW_ERROR_CHECK(sw_child1, result);    //正常这1句就够，不处理错误，直接raise error，返回

        //或者自己处理错误
        // if(result == SW_ERROR){
        //     printf("error detected in child 1\n");
        //     return SW_ENDED
        // }

        printf("child 1 success\n");

        return SW_ENDED;
        

    SW_END(sw_child1);
}

char sw_root_task(){
    char result = SW_WAITING;

    SW_BEGIN(sw_root);

        SW_WAIT_TASK_WITH_RESULT(sw_root, sw_child1_task(), result);
        SW_ERROR_CHECK(sw_root, result);    //正常这1句就够，会不处理错误，直接raise error，返回

        //或者自己处理错误
        // if(result == SW_ERROR){
        //     printf("error detected in root\n");
        //     return SW_ENDED;
        // }

        printf("root success\n");
        return SW_ENDED;
        
    SW_END(sw_root);
}


int main(){
    while (1){
        char result = sw_root_task();

        if( result == SW_ENDED ){
            printf("task done\n");
            break;//只运行一次

        }else if( result == SW_ERROR ){
            printf("handle err in main\n");
            break;//只运行一次
        }
    }

    return 0;
}